Fric-frac CountryController
De CountryController
klasse dispatcht alle request die verband houden met het beheer van de Country
entiteit. Dat komt neer op het afhandelen van alle use cases die we hebben opgesteld voor het beheren van de entiteit Country
, o.a.:
- I
ndex
ReadingOne
InsertingOne
UpdatingOne
DeleteOne
InsertOne
UpdateOne
De CountryController klasse
- Maak een nieuwe
Controller
klasse in de Controllers map. Hoe je dat doen hebben we geleerd in Fric-frac AdminController. - Kies ervoor om een MVC Controller Class te maken en geef er de naam CountryController.cs aan.
- Injecteer de DBContext in de constructor:
namespace FricFrac.Controllers { public class CountryController : Controller { private readonly Docent300Context dbContext; // voeg constructor toe om geïnjecteerde DBContext // te kunnen binnenkrijgen in deze klasse public CountryController(Docent300Context dbContext) { this.dbContext = dbContext; }
- We beginnen met methoden die de bedoeling hebben een input view aan de gebruiker te tonen. We wijzigen of voegen daarvoor de volgende methoden toe:
- De
Index
methodeDe Index methode handelt de Country/Index use case af. We raadplegen Fric-frac Use Case Person Index om nog eens na te gaan wat die methode precies moet doen. Aan de view geven we de lijst van de landen mee:
// GET: /<controller>/ public IActionResult Index() { ViewBag.Title = "Fric-frac Country Index"; return View(dbContext.Country.ToList()); }
- De
InsertingOne
methode toevoegenOm naar de
InsertingOne
view te kunnen navigeren moeten we de use case/Country/InsertingOne
die staat op de Index.cshtml pagina implementeren. Daarvoor moeten we een methode maken in deCountryController
klasse die het klikken op de link inIndex
.cshtml
afhandelt. De naam van de methode moet de afspraken, die gelden binnen het MVC framework, moet dusInsertingOne
zijn. Dat is dezelfde naam als het twee deel van de URL. Het eerste deel van de URL verwijst naar de naam van de controller. We geven de lijst van de landen aan de view mee:public IActionResult InsertingOne() { ViewBag.Title = "Fric-frac Country Inserting One"; return View(dbContext.Country.ToList()); }
- De
ReadingOne
actiemethode toevoegenOm naar de
ReadingOne
pagina te kunnen navigeren moeten we de use case/Country/ReadingOne,
die staat op de op alle pagina's waarop een lijst met landen staat waaruit een land geselecteerd kan worden, implementeren. Daarvoor moeten we een methode maken in deCountryController
klasse die het klikken op de select link<a href = "/Country/ReadingOne_XX">
afhandelt. De XX staat voor de Id van de rij. De naam van de methode, geheel volgens de afspraken binnen het MVC framework, is dus ReadingOne. Dat is dezelfde naam als het twee deel van de URL. Het eerste deel van de URL verwijst naar de naam van de controller. Deze naam is de naam van de actiemethode in deCountryController
klasse en de naam van de view die door deze methode geretourneerd wordt. Met behulp van Linq halen we de gewenste rij op en geven het object door aan de view:[HttpGet] public IActionResult ReadingOne(int? id) { ViewBag.Message = "Insert een land in de database"; if (id == null) { return NotFound(); } var country = dbContext.Country.SingleOrDefault(m => m.Id == id); if (country == null) { return NotFound(); } return View(country); }
- De UpdatingOne actiemethode toevoegen
Om naar de Updating pagina te kunnen navigeren moeten we de use case
/Country/UpdatingOne/XX,
die staat op deReadingOne
pagina staat, implementeren. Daarvoor moeten we een methode maken in deCountryController
klasse die het klikken op de select link<a href = "/Country/UpdatingOne/XX">
afhandelt. De XX staat voor de Id van de rij. De naam van de methode, geheel volgens de afspraken binnen het MVC framework, is dus UpdatingOne. Dat is dezelfde naam als het twee deel van de URL. Het eerste deel van de URL verwijst naar de naam van de controller. Deze naam is de naam van de actiemethode in deCountryController
klasse en de naam van de view die door deze methode geretourneerd wordt. De link, die deze use case in gang zet, De html code daarvoor ziet er zo uit:<a href="/Country/UpdatingOne/@Model.Id" class="tile"> <span class="icon-pencil"></span> <span class="screen-reader-text">Updating One</span> </a>
We implementeren nu de actiemethode
UpdatingOne
in deCountryController
klasse. De methode krijgt als argument deId
van de te zoeken rij mee.[HttpGet] public IActionResult UpdatingOne(int? id) { ViewBag.Title = "Fric-frac Country Updating One"; if (id == null) { return NotFound(); } var country = dbContext.Country.SingleOrDefault(m => m.Id == id); if (country == null) { return NotFound(); } return View(country); }
- De Cancel methode toevoegen
Met de Cancel knop keert de gebruiker terug naar de Index view:
public IActionResult Cancel() { return RedirectToAction("Index"); }
- De
- De CRUD methoden
- InsertOne
Om een rij aan de tabel te kunnen toevoegen moeten we eerst het
Country
model binden aan de input van de gebruiker. In hetCountry
model hebben we aangeven met welk name attribuut een property overeenkomt:[FromForm(Name = "Country-Name")]
ASP.NET MVC is daardoor in staat automatisch de inputvelden van de form te binden aan het model:
[HttpPost] public IActionResult InsertOne(Models.FricFrac.Country Country) { ViewBag.Message = "Insert een land in de database"; dbContext.Country.Add(Country); dbContext.SaveChanges(); return View("Index", dbContext.Country); }
- UpdateOne
[HttpPost] public IActionResult UpdateOne(Models.FricFrac.Country country) { if (ModelState.IsValid) { try { dbContext.Update(country); dbContext.SaveChanges(); return View("ReadingOne", country); } catch (DbUpdateConcurrencyException) { if (!dbContext.Country.Any(e => e.Id == country.Id)) { return NotFound(); } else { throw; } } } return View("Index", country); }
- DeleteOne
// GET: Supplier/Delete/5 public IActionResult DeleteOne(int? id) { if (id == null) { return NotFound(); } // zoek het land dat verwijderd moet worden var country = dbContext.Country.SingleOrDefault(m => m.Id == id); if (country == null) { return NotFound(); } dbContext.Country.Remove(country); dbContext.SaveChanges(); // keer terug naar de index pagina return RedirectToAction("Index"); }
- InsertOne